#coding:utf-8
# top 1 accuracy 0.9249791286257038 top k accuracy 0.9747623788455786
import os
import random
import tensorflow.contrib.slim as slim
import time
import logging
import numpy as np
import tensorflow as tf
import pickle
from PIL import Image
from tensorflow.python.ops import control_flow_ops
import matplotlib.pyplot as plt


logger = logging.getLogger('Training a chinese write char recognition')
logger.setLevel(logging.INFO)
# formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
logger.addHandler(ch)


tf.app.flags.DEFINE_boolean('random_flip_up_down', False, "Whether to random flip up down")
tf.app.flags.DEFINE_boolean('random_brightness', True, "whether to adjust brightness")
tf.app.flags.DEFINE_boolean('random_contrast', True, "whether to random constrast")

tf.app.flags.DEFINE_integer('charset_size', 3755, "Choose the first `charset_size` characters only.")
tf.app.flags.DEFINE_integer('image_size', 64, "Needs to provide same value as in training.")
tf.app.flags.DEFINE_boolean('gray', True, "whether to change the rbg to gray")
tf.app.flags.DEFINE_integer('max_steps', 160000, 'the max training steps ')
tf.app.flags.DEFINE_integer('eval_steps', 1000, "the step num to eval")
tf.app.flags.DEFINE_integer('save_steps', 10000, "the steps to save")

tf.app.flags.DEFINE_string('checkpoint_dir', './checkpoint/', 'the checkpoint dir')
tf.app.flags.DEFINE_string('train_data_dir', './train/', 'the train dataset dir')
tf.app.flags.DEFINE_string('test_data_dir', './test/', 'the test dataset dir')
tf.app.flags.DEFINE_string('log_dir', './log', 'the logging dir')

tf.app.flags.DEFINE_boolean('restore', False, 'whether to restore from checkpoint')
tf.app.flags.DEFINE_boolean('epoch', 1, 'Number of epoches')
tf.app.flags.DEFINE_integer('batch_size', 128, 'Validation batch size')
tf.app.flags.DEFINE_string('mode', 'validation', 'Running mode. One of {"train", "valid", "test"}')

char_dict= {'一': 0, '丁': 1, '七': 2, '万': 3, '丈': 4, '三': 5, '上': 6, '下': 7, '不': 8, '与': 9, '丑': 10, '专': 11, '且': 12, '世': 13, '丘': 14, '丙': 15, '业': 16, '丛': 17, '东': 18, '丝': 19, '丢': 20, '两': 21, '严': 22, '丧': 23, '个': 24, '丫': 25, '中': 26, '丰': 27, '串': 28, '临': 29, '丸': 30, '丹': 31, '为': 32, '主': 33, '丽': 34, '举': 35, '乃': 36, '久': 37, '么': 38, '义': 39, '之': 40, '乌': 41, '乍': 42, '乎': 43, '乏': 44, '乐': 45, '乒': 46, '乓': 47, '乔': 48, '乖': 49, '乘': 50, '乙': 51, '九': 52, '乞': 53, '也': 54, '习': 55, '乡': 56, '书': 57, '买': 58, '乱': 59, '乳': 60, '乾': 61, '了': 62, '予': 63, '争': 64, '事': 65, '二': 66, '于': 67, '亏': 68, '云': 69, '互': 70, '五': 71, '井': 72, '亚': 73, '些': 74, '亡': 75, '亢': 76, '交': 77, '亥': 78, '亦': 79, '产': 80, '亨': 81, '亩': 82, '享': 83, '京': 84, '亭': 85, '亮': 86, '亲': 87, '人': 88, '亿': 89, '什': 90, '仁': 91, '仅': 92, '仆': 93, '仇': 94, '今': 95, '介': 96, '仍': 97, '从': 98, '仑': 99, '仓': 100, '仔': 101, '仕': 102, '他': 103, '仗': 104, '付': 105, '仙': 106, '仟': 107, '代': 108, '令': 109, '以': 110, '仪': 111, '们': 112, '仰': 113, '仲': 114, '件': 115, '价': 116, '任': 117, '份': 118, '仿': 119, '企': 120, '伊': 121, '伍': 122, '伎': 123, '伏': 124, '伐': 125, '休': 126, '众': 127, '优': 128, '伙': 129, '会': 130, '伞': 131, '伟': 132, '传': 133, '伤': 134, '伦': 135, '伪': 136, '伯': 137, '估': 138, '伴': 139, '伶': 140, '伸': 141, '伺': 142, '似': 143, '佃': 144, '但': 145, '位': 146, '低': 147, '住': 148, '佐': 149, '佑': 150, '体': 151, '何': 152, '余': 153, '佛': 154, '作': 155, '你': 156, '佣': 157, '佩': 158, '佬': 159, '佯': 160, '佰': 161, '佳': 162, '使': 163, '侄': 164, '侈': 165, '例': 166, '侍': 167, '侗': 168, '供': 169, '依': 170, '侠': 171, '侣': 172, '侥': 173, '侦': 174, '侧': 175, '侨': 176, '侩': 177, '侮': 178, '侯': 179, '侵': 180, '便': 181, '促': 182, '俄': 183, '俊': 184, '俏': 185, '俐': 186, '俗': 187, '俘': 188, '保': 189, '俞': 190, '信': 191, '俩': 192, '俭': 193, '修': 194, '俯': 195, '俱': 196, '俺': 197, '倍': 198, '倒': 199, '倔': 200, '倘': 201, '候': 202, '倚': 203, '借': 204, '倡': 205, '倦': 206, '倪': 207, '债': 208, '值': 209, '倾': 210, '假': 211, '偏': 212, '做': 213, '停': 214, '健': 215, '偶': 216, '偷': 217, '偿': 218, '傀': 219, '傅': 220, '傈': 221, '傍': 222, '傣': 223, '储': 224, '催': 225, '傲': 226, '傻': 227, '像': 228, '僚': 229, '僧': 230, '僳': 231, '僵': 232, '僻': 233, '儒': 234, '儡': 235, '儿': 236, '允': 237, '元': 238, '兄': 239, '充': 240, '兆': 241, '先': 242, '光': 243, '克': 244, '免': 245, '兑': 246, '兔': 247, '党': 248, '兜': 249, '兢': 250, '入': 251, '全': 252, '八': 253, '公': 254, '六': 255, '兰': 256, '共': 257, '关': 258, '兴': 259, '兵': 260, '其': 261, '具': 262, '典': 263, '兹': 264, '养': 265, '兼': 266, '兽': 267, '冀': 268, '内': 269, '冈': 270, '冉': 271, '册': 272, '再': 273, '冒': 274, '冕': 275, '冗': 276, '写': 277, '军': 278, '农': 279, '冠': 280, '冤': 281, '冬': 282, '冯': 283, '冰': 284, '冲': 285, '决': 286, '况': 287, '冶': 288, '冷': 289, '冻': 290, '净': 291, '凄': 292, '准': 293, '凉': 294, '凋': 295, '凌': 296, '减': 297, '凑': 298, '凛': 299, '凝': 300, '几': 301, '凡': 302, '凤': 303, '凭': 304, '凯': 305, '凰': 306, '凳': 307, '凶': 308, '凸': 309, '凹': 310, '出': 311, '击': 312, '函': 313, '凿': 314, '刀': 315, '刁': 316, '刃': 317, '分': 318, '切': 319, '刊': 320, '刑': 321, '划': 322, '列': 323, '刘': 324, '则': 325, '刚': 326, '创': 327, '初': 328, '删': 329, '判': 330, '刨': 331, '利': 332, '别': 333, '刮': 334, '到': 335, '制': 336, '刷': 337, '券': 338, '刹': 339, '刺': 340, '刻': 341, '刽': 342, '剁': 343, '剂': 344, '剃': 345, '削': 346, '前': 347, '剐': 348, '剑': 349, '剔': 350, '剖': 351, '剥': 352, '剧': 353, '剩': 354, '剪': 355, '副': 356, '割': 357, '剿': 358, '劈': 359, '力': 360, '劝': 361, '办': 362, '功': 363, '加': 364, '务': 365, '劣': 366, '动': 367, '助': 368, '努': 369, '劫': 370, '励': 371, '劲': 372, '劳': 373, '势': 374, '勃': 375, '勇': 376, '勉': 377, '勋': 378, '勒': 379, '勘': 380, '募': 381, '勤': 382, '勺': 383, '勾': 384, '勿': 385, '匀': 386, '包': 387, '匆': 388, '匈': 389, '化': 390, '北': 391, '匙': 392, '匝': 393, '匠': 394, '匡': 395, '匣': 396, '匪': 397, '匹': 398, '区': 399, '医': 400, '匿': 401, '十': 402, '千': 403, '升': 404, '午': 405, '卉': 406, '半': 407, '华': 408, '协': 409, '卑': 410, '卒': 411, '卓': 412, '单': 413, '卖': 414, '南': 415, '博': 416, '卜': 417, '卞': 418, '占': 419, '卡': 420, '卢': 421, '卤': 422, '卧': 423, '卫': 424, '卯': 425, '印': 426, '危': 427, '即': 428, '却': 429, '卵': 430, '卷': 431, '卸': 432, '卿': 433, '厂': 434, '厄': 435, '厅': 436, '历': 437, '厉': 438, '压': 439, '厌': 440, '厕': 441, '厘': 442, '厚': 443, '原': 444, '厢': 445, '厦': 446, '厨': 447, '厩': 448, '去': 449, '县': 450, '叁': 451, '参': 452, '又': 453, '叉': 454, '及': 455, '友': 456, '双': 457, '反': 458, '发': 459, '叔': 460, '取': 461, '受': 462, '变': 463, '叙': 464, '叛': 465, '叠': 466, '口': 467, '古': 468, '句': 469, '另': 470, '只': 471, '叫': 472, '召': 473, '叭': 474, '叮': 475, '可': 476, '台': 477, '史': 478, '右': 479, '叶': 480, '号': 481, '司': 482, '叹': 483, '叼': 484, '吁': 485, '吃': 486, '各': 487, '合': 488, '吉': 489, '吊': 490, '同': 491, '名': 492, '后': 493, '吏': 494, '吐': 495, '向': 496, '吓': 497, '吕': 498, '吗': 499, '君': 500, '吝': 501, '吞': 502, '吟': 503, '吠': 504, '否': 505, '吧': 506, '吨': 507, '吩': 508, '含': 509, '听': 510, '吭': 511, '吮': 512, '启': 513, '吱': 514, '吴': 515, '吵': 516, '吸': 517, '吹': 518, '吻': 519, '吼': 520, '吾': 521, '呀': 522, '呆': 523, '呈': 524, '告': 525, '呐': 526, '呕': 527, '员': 528, '呛': 529, '呜': 530, '呢': 531, '周': 532, '味': 533, '呵': 534, '呸': 535, '呻': 536, '呼': 537, '命': 538, '咀': 539, '咆': 540, '咋': 541, '和': 542, '咎': 543, '咏': 544, '咐': 545, '咒': 546, '咕': 547, '咖': 548, '咙': 549, '咨': 550, '咬': 551, '咯': 552, '咱': 553, '咳': 554, '咸': 555, '咽': 556, '哀': 557, '品': 558, '哄': 559, '哆': 560, '哇': 561, '哈': 562, '哉': 563, '响': 564, '哎': 565, '哑': 566, '哗': 567, '哟': 568, '哥': 569, '哦': 570, '哨': 571, '哩': 572, '哪': 573, '哭': 574, '哮': 575, '哲': 576, '哺': 577, '哼': 578, '唁': 579, '唆': 580, '唇': 581, '唉': 582, '唐': 583, '唤': 584, '唬': 585, '售': 586, '唯': 587, '唱': 588, '唾': 589, '啃': 590, '啄': 591, '商': 592, '啊': 593, '啡': 594, '啤': 595, '啥': 596, '啦': 597, '啪': 598, '啮': 599, '啸': 600, '啼': 601, '喀': 602, '喂': 603, '善': 604, '喇': 605, '喉': 606, '喊': 607, '喘': 608, '喜': 609, '喝': 610, '喧': 611, '喳': 612, '喷': 613, '喻': 614, '嗅': 615, '嗓': 616, '嗜': 617, '嗡': 618, '嗣': 619, '嗽': 620, '嘉': 621, '嘎': 622, '嘘': 623, '嘛': 624, '嘱': 625, '嘲': 626, '嘴': 627, '嘶': 628, '嘻': 629, '嘿': 630, '噎': 631, '器': 632, '噪': 633, '噬': 634, '噶': 635, '嚎': 636, '嚏': 637, '嚣': 638, '嚷': 639, '嚼': 640, '囊': 641, '囚': 642, '四': 643, '回': 644, '因': 645, '团': 646, '囤': 647, '园': 648, '困': 649, '囱': 650, '围': 651, '固': 652, '国': 653, '图': 654, '圃': 655, '圆': 656, '圈': 657, '土': 658, '圣': 659, '在': 660, '圭': 661, '地': 662, '场': 663, '圾': 664, '址': 665, '均': 666, '坊': 667, '坍': 668, '坎': 669, '坏': 670, '坐': 671, '坑': 672, '块': 673, '坚': 674, '坛': 675, '坝': 676, '坞': 677, '坟': 678, '坠': 679, '坡': 680, '坤': 681, '坦': 682, '坪': 683, '坯': 684, '坷': 685, '垂': 686, '垃': 687, '垄': 688, '型': 689, '垒': 690, '垛': 691, '垢': 692, '垣': 693, '垦': 694, '垫': 695, '垮': 696, '埂': 697, '埃': 698, '埋': 699, '城': 700, '埔': 701, '域': 702, '埠': 703, '培': 704, '基': 705, '堂': 706, '堆': 707, '堑': 708, '堕': 709, '堡': 710, '堤': 711, '堪': 712, '堰': 713, '堵': 714, '塌': 715, '塑': 716, '塔': 717, '塘': 718, '塞': 719, '填': 720, '境': 721, '墅': 722, '墒': 723, '墓': 724, '墙': 725, '增': 726, '墟': 727, '墨': 728, '墩': 729, '壁': 730, '壕': 731, '壤': 732, '士': 733, '壬': 734, '壮': 735, '声': 736, '壳': 737, '壶': 738, '壹': 739, '处': 740, '备': 741, '复': 742, '夏': 743, '夕': 744, '外': 745, '多': 746, '夜': 747, '够': 748, '大': 749, '天': 750, '太': 751, '夫': 752, '央': 753, '夯': 754, '失': 755, '头': 756, '夷': 757, '夸': 758, '夹': 759, '夺': 760, '奄': 761, '奇': 762, '奈': 763, '奉': 764, '奋': 765, '奎': 766, '奏': 767, '契': 768, '奔': 769, '奖': 770, '套': 771, '奠': 772, '奢': 773, '奥': 774, '女': 775, '奴': 776, '奶': 777, '奸': 778, '她': 779, '好': 780, '如': 781, '妄': 782, '妆': 783, '妇': 784, '妈': 785, '妊': 786, '妒': 787, '妓': 788, '妖': 789, '妙': 790, '妥': 791, '妨': 792, '妮': 793, '妹': 794, '妻': 795, '姆': 796, '始': 797, '姐': 798, '姑': 799, '姓': 800, '委': 801, '姚': 802, '姜': 803, '姥': 804, '姨': 805, '姬': 806, '姻': 807, '姿': 808, '威': 809, '娃': 810, '娄': 811, '娇': 812, '娘': 813, '娜': 814, '娟': 815, '娠': 816, '娥': 817, '娩': 818, '娱': 819, '娶': 820, '婆': 821, '婉': 822, '婚': 823, '婪': 824, '婴': 825, '婶': 826, '婿': 827, '媒': 828, '媚': 829, '媳': 830, '嫁': 831, '嫂': 832, '嫉': 833, '嫌': 834, '嫡': 835, '嫩': 836, '子': 837, '孔': 838, '孕': 839, '字': 840, '存': 841, '孙': 842, '孜': 843, '孝': 844, '孟': 845, '季': 846, '孤': 847, '学': 848, '孩': 849, '孪': 850, '孰': 851, '孵': 852, '孺': 853, '孽': 854, '宁': 855, '它': 856, '宅': 857, '宇': 858, '守': 859, '安': 860, '宋': 861, '完': 862, '宏': 863, '宗': 864, '官': 865, '宙': 866, '定': 867, '宛': 868, '宜': 869, '宝': 870, '实': 871, '宠': 872, '审': 873, '客': 874, '宣': 875, '室': 876, '宦': 877, '宪': 878, '宫': 879, '宰': 880, '害': 881, '宴': 882, '宵': 883, '家': 884, '容': 885, '宽': 886, '宾': 887, '宿': 888, '寂': 889, '寄': 890, '寅': 891, '密': 892, '寇': 893, '富': 894, '寐': 895, '寒': 896, '寓': 897, '寝': 898, '寞': 899, '察': 900, '寡': 901, '寥': 902, '寨': 903, '寸': 904, '对': 905, '寺': 906, '寻': 907, '导': 908, '寿': 909, '封': 910, '射': 911, '将': 912, '尉': 913, '尊': 914, '小': 915, '少': 916, '尔': 917, '尖': 918, '尘': 919, '尚': 920, '尝': 921, '尤': 922, '尧': 923, '就': 924, '尸': 925, '尹': 926, '尺': 927, '尼': 928, '尽': 929, '尾': 930, '尿': 931, '局': 932, '屁': 933, '层': 934, '居': 935, '屈': 936, '屉': 937, '届': 938, '屋': 939, '屎': 940, '屏': 941, '屑': 942, '展': 943, '属': 944, '屠': 945, '屡': 946, '履': 947, '屯': 948, '山': 949, '屹': 950, '屿': 951, '岁': 952, '岂': 953, '岔': 954, '岗': 955, '岛': 956, '岩': 957, '岭': 958, '岳': 959, '岸': 960, '岿': 961, '峙': 962, '峡': 963, '峦': 964, '峨': 965, '峪': 966, '峭': 967, '峰': 968, '峻': 969, '崇': 970, '崎': 971, '崔': 972, '崖': 973, '崩': 974, '崭': 975, '嵌': 976, '巍': 977, '川': 978, '州': 979, '巡': 980, '巢': 981, '工': 982, '左': 983, '巧': 984, '巨': 985, '巩': 986, '巫': 987, '差': 988, '己': 989, '已': 990, '巳': 991, '巴': 992, '巷': 993, '巾': 994, '币': 995, '市': 996, '布': 997, '帅': 998, '帆': 999, '师': 1000, '希': 1001, '帐': 1002, '帕': 1003, '帖': 1004, '帘': 1005, '帚': 1006, '帛': 1007, '帜': 1008, '帝': 1009, '带': 1010, '帧': 1011, '席': 1012, '帮': 1013, '常': 1014, '帽': 1015, '幂': 1016, '幅': 1017, '幌': 1018, '幕': 1019, '幢': 1020, '干': 1021, '平': 1022, '年': 1023, '并': 1024, '幸': 1025, '幻': 1026, '幼': 1027, '幽': 1028, '广': 1029, '庄': 1030, '庆': 1031, '庇': 1032, '床': 1033, '序': 1034, '庐': 1035, '库': 1036, '应': 1037, '底': 1038, '店': 1039, '庙': 1040, '庚': 1041, '府': 1042, '庞': 1043, '废': 1044, '度': 1045, '座': 1046, '庭': 1047, '庶': 1048, '康': 1049, '庸': 1050, '廉': 1051, '廊': 1052, '廓': 1053, '廖': 1054, '延': 1055, '廷': 1056, '建': 1057, '开': 1058, '异': 1059, '弃': 1060, '弄': 1061, '弊': 1062, '式': 1063, '弓': 1064, '引': 1065, '弗': 1066, '弘': 1067, '弛': 1068, '弟': 1069, '张': 1070, '弥': 1071, '弦': 1072, '弧': 1073, '弯': 1074, '弱': 1075, '弹': 1076, '强': 1077, '归': 1078, '当': 1079, '录': 1080, '彝': 1081, '形': 1082, '彤': 1083, '彦': 1084, '彩': 1085, '彪': 1086, '彬': 1087, '彭': 1088, '彰': 1089, '影': 1090, '役': 1091, '彻': 1092, '彼': 1093, '往': 1094, '征': 1095, '径': 1096, '待': 1097, '很': 1098, '徊': 1099, '律': 1100, '徐': 1101, '徒': 1102, '得': 1103, '徘': 1104, '御': 1105, '循': 1106, '微': 1107, '德': 1108, '徽': 1109, '心': 1110, '必': 1111, '忆': 1112, '忌': 1113, '忍': 1114, '志': 1115, '忘': 1116, '忙': 1117, '忠': 1118, '忧': 1119, '快': 1120, '忱': 1121, '念': 1122, '忻': 1123, '忽': 1124, '忿': 1125, '怀': 1126, '态': 1127, '怂': 1128, '怎': 1129, '怒': 1130, '怔': 1131, '怕': 1132, '怖': 1133, '怜': 1134, '思': 1135, '怠': 1136, '急': 1137, '性': 1138, '怨': 1139, '怪': 1140, '怯': 1141, '总': 1142, '恃': 1143, '恋': 1144, '恍': 1145, '恐': 1146, '恒': 1147, '恕': 1148, '恢': 1149, '恤': 1150, '恨': 1151, '恩': 1152, '恫': 1153, '恬': 1154, '恭': 1155, '息': 1156, '恰': 1157, '恳': 1158, '恶': 1159, '恼': 1160, '恿': 1161, '悄': 1162, '悉': 1163, '悍': 1164, '悔': 1165, '悟': 1166, '悠': 1167, '患': 1168, '悦': 1169, '您': 1170, '悬': 1171, '悯': 1172, '悲': 1173, '悸': 1174, '悼': 1175, '情': 1176, '惊': 1177, '惋': 1178, '惑': 1179, '惕': 1180, '惜': 1181, '惟': 1182, '惠': 1183, '惦': 1184, '惧': 1185, '惨': 1186, '惩': 1187, '惫': 1188, '惭': 1189, '惮': 1190, '惯': 1191, '惰': 1192, '想': 1193, '惶': 1194, '惹': 1195, '惺': 1196, '愁': 1197, '愈': 1198, '愉': 1199, '意': 1200, '愚': 1201, '感': 1202, '愤': 1203, '愧': 1204, '愿': 1205, '慈': 1206, '慌': 1207, '慎': 1208, '慑': 1209, '慕': 1210, '慢': 1211, '慧': 1212, '慨': 1213, '慰': 1214, '慷': 1215, '憋': 1216, '憎': 1217, '憨': 1218, '憾': 1219, '懂': 1220, '懈': 1221, '懊': 1222, '懒': 1223, '懦': 1224, '戈': 1225, '戊': 1226, '戌': 1227, '戍': 1228, '戎': 1229, '戏': 1230, '成': 1231, '我': 1232, '戒': 1233, '或': 1234, '战': 1235, '戚': 1236, '截': 1237, '戮': 1238, '戳': 1239, '戴': 1240, '户': 1241, '房': 1242, '所': 1243, '扁': 1244, '扇': 1245, '手': 1246, '才': 1247, '扎': 1248, '扑': 1249, '扒': 1250, '打': 1251, '扔': 1252, '托': 1253, '扛': 1254, '扣': 1255, '扦': 1256, '执': 1257, '扩': 1258, '扫': 1259, '扬': 1260, '扭': 1261, '扮': 1262, '扯': 1263, '扰': 1264, '扳': 1265, '扶': 1266, '批': 1267, '扼': 1268, '找': 1269, '承': 1270, '技': 1271, '抄': 1272, '抉': 1273, '把': 1274, '抑': 1275, '抒': 1276, '抓': 1277, '投': 1278, '抖': 1279, '抗': 1280, '折': 1281, '抚': 1282, '抛': 1283, '抠': 1284, '抡': 1285, '抢': 1286, '护': 1287, '报': 1288, '抨': 1289, '披': 1290, '抬': 1291, '抱': 1292, '抵': 1293, '抹': 1294, '押': 1295, '抽': 1296, '抿': 1297, '拂': 1298, '拄': 1299, '担': 1300, '拆': 1301, '拇': 1302, '拈': 1303, '拉': 1304, '拌': 1305, '拍': 1306, '拎': 1307, '拐': 1308, '拒': 1309, '拓': 1310, '拔': 1311, '拖': 1312, '拘': 1313, '拙': 1314, '招': 1315, '拜': 1316, '拟': 1317, '拢': 1318, '拣': 1319, '拥': 1320, '拦': 1321, '拧': 1322, '拨': 1323, '择': 1324, '括': 1325, '拭': 1326, '拯': 1327, '拱': 1328, '拳': 1329, '拴': 1330, '拷': 1331, '拼': 1332, '拽': 1333, '拾': 1334, '拿': 1335, '持': 1336, '挂': 1337, '指': 1338, '按': 1339, '挎': 1340, '挑': 1341, '挖': 1342, '挚': 1343, '挛': 1344, '挝': 1345, '挞': 1346, '挟': 1347, '挠': 1348, '挡': 1349, '挣': 1350, '挤': 1351, '挥': 1352, '挨': 1353, '挪': 1354, '挫': 1355, '振': 1356, '挺': 1357, '挽': 1358, '捂': 1359, '捅': 1360, '捆': 1361, '捉': 1362, '捌': 1363, '捍': 1364, '捎': 1365, '捏': 1366, '捐': 1367, '捕': 1368, '捞': 1369, '损': 1370, '捡': 1371, '换': 1372, '捣': 1373, '捧': 1374, '据': 1375, '捶': 1376, '捷': 1377, '捻': 1378, '掀': 1379, '掂': 1380, '掇': 1381, '授': 1382, '掉': 1383, '掌': 1384, '掏': 1385, '掐': 1386, '排': 1387, '掖': 1388, '掘': 1389, '掠': 1390, '探': 1391, '掣': 1392, '接': 1393, '控': 1394, '推': 1395, '掩': 1396, '措': 1397, '掳': 1398, '掷': 1399, '掸': 1400, '掺': 1401, '揉': 1402, '揍': 1403, '描': 1404, '提': 1405, '插': 1406, '揖': 1407, '握': 1408, '揣': 1409, '揩': 1410, '揪': 1411, '揭': 1412, '援': 1413, '揽': 1414, '搀': 1415, '搁': 1416, '搂': 1417, '搅': 1418, '搏': 1419, '搐': 1420, '搓': 1421, '搔': 1422, '搜': 1423, '搞': 1424, '搪': 1425, '搬': 1426, '搭': 1427, '携': 1428, '搽': 1429, '摄': 1430, '摆': 1431, '摇': 1432, '摈': 1433, '摊': 1434, '摔': 1435, '摘': 1436, '摧': 1437, '摩': 1438, '摸': 1439, '摹': 1440, '撂': 1441, '撅': 1442, '撇': 1443, '撑': 1444, '撒': 1445, '撕': 1446, '撞': 1447, '撤': 1448, '撩': 1449, '撬': 1450, '播': 1451, '撮': 1452, '撰': 1453, '撵': 1454, '撼': 1455, '擂': 1456, '擅': 1457, '操': 1458, '擎': 1459, '擒': 1460, '擞': 1461, '擦': 1462, '攀': 1463, '攒': 1464, '攘': 1465, '攫': 1466, '支': 1467, '收': 1468, '改': 1469, '攻': 1470, '放': 1471, '政': 1472, '故': 1473, '效': 1474, '敌': 1475, '敏': 1476, '救': 1477, '敖': 1478, '教': 1479, '敛': 1480, '敝': 1481, '敞': 1482, '敢': 1483, '散': 1484, '敦': 1485, '敬': 1486, '数': 1487, '敲': 1488, '整': 1489, '敷': 1490, '文': 1491, '斋': 1492, '斌': 1493, '斑': 1494, '斗': 1495, '料': 1496, '斜': 1497, '斟': 1498, '斡': 1499, '斤': 1500, '斥': 1501, '斧': 1502, '斩': 1503, '断': 1504, '斯': 1505, '新': 1506, '方': 1507, '施': 1508, '旁': 1509, '旅': 1510, '旋': 1511, '族': 1512, '旗': 1513, '无': 1514, '既': 1515, '日': 1516, '旦': 1517, '旧': 1518, '旨': 1519, '早': 1520, '旬': 1521, '旭': 1522, '旱': 1523, '时': 1524, '旷': 1525, '旺': 1526, '昂': 1527, '昆': 1528, '昌': 1529, '明': 1530, '昏': 1531, '易': 1532, '昔': 1533, '星': 1534, '映': 1535, '春': 1536, '昧': 1537, '昨': 1538, '昭': 1539, '是': 1540, '昼': 1541, '显': 1542, '晃': 1543, '晋': 1544, '晌': 1545, '晒': 1546, '晓': 1547, '晕': 1548, '晚': 1549, '晤': 1550, '晦': 1551, '晨': 1552, '普': 1553, '景': 1554, '晰': 1555, '晴': 1556, '晶': 1557, '智': 1558, '晾': 1559, '暂': 1560, '暇': 1561, '暑': 1562, '暖': 1563, '暗': 1564, '暮': 1565, '暴': 1566, '曙': 1567, '曝': 1568, '曰': 1569, '曲': 1570, '曳': 1571, '更': 1572, '曹': 1573, '曼': 1574, '曾': 1575, '替': 1576, '最': 1577, '月': 1578, '有': 1579, '朋': 1580, '服': 1581, '朔': 1582, '朗': 1583, '望': 1584, '朝': 1585, '期': 1586, '木': 1587, '未': 1588, '末': 1589, '本': 1590, '札': 1591, '术': 1592, '朱': 1593, '朴': 1594, '朵': 1595, '机': 1596, '朽': 1597, '杀': 1598, '杂': 1599, '权': 1600, '杆': 1601, '杉': 1602, '李': 1603, '杏': 1604, '材': 1605, '村': 1606, '杖': 1607, '杜': 1608, '束': 1609, '杠': 1610, '条': 1611, '来': 1612, '杨': 1613, '杭': 1614, '杯': 1615, '杰': 1616, '松': 1617, '板': 1618, '极': 1619, '构': 1620, '枉': 1621, '析': 1622, '枕': 1623, '林': 1624, '枚': 1625, '果': 1626, '枝': 1627, '枢': 1628, '枣': 1629, '枪': 1630, '枫': 1631, '枯': 1632, '架': 1633, '枷': 1634, '柄': 1635, '柏': 1636, '某': 1637, '柑': 1638, '柒': 1639, '染': 1640, '柔': 1641, '柜': 1642, '柞': 1643, '柠': 1644, '查': 1645, '柬': 1646, '柯': 1647, '柱': 1648, '柳': 1649, '柴': 1650, '柿': 1651, '栅': 1652, '标': 1653, '栈': 1654, '栋': 1655, '栏': 1656, '树': 1657, '栓': 1658, '栖': 1659, '栗': 1660, '校': 1661, '株': 1662, '样': 1663, '核': 1664, '根': 1665, '格': 1666, '栽': 1667, '桂': 1668, '桃': 1669, '桅': 1670, '框': 1671, '案': 1672, '桌': 1673, '桐': 1674, '桑': 1675, '桓': 1676, '桔': 1677, '档': 1678, '桥': 1679, '桨': 1680, '桩': 1681, '桶': 1682, '梁': 1683, '梅': 1684, '梆': 1685, '梗': 1686, '梢': 1687, '梦': 1688, '梧': 1689, '梨': 1690, '梭': 1691, '梯': 1692, '械': 1693, '梳': 1694, '检': 1695, '棉': 1696, '棋': 1697, '棍': 1698, '棒': 1699, '棕': 1700, '棘': 1701, '棚': 1702, '棠': 1703, '森': 1704, '棱': 1705, '棵': 1706, '棺': 1707, '椅': 1708, '植': 1709, '椎': 1710, '椒': 1711, '椭': 1712, '椰': 1713, '椽': 1714, '椿': 1715, '楔': 1716, '楚': 1717, '楞': 1718, '楷': 1719, '楼': 1720, '概': 1721, '榆': 1722, '榔': 1723, '榜': 1724, '榨': 1725, '榴': 1726, '榷': 1727, '槐': 1728, '槛': 1729, '槽': 1730, '樊': 1731, '樟': 1732, '模': 1733, '横': 1734, '樱': 1735, '橇': 1736, '橙': 1737, '橡': 1738, '橱': 1739, '檀': 1740, '檄': 1741, '檬': 1742, '欠': 1743, '次': 1744, '欢': 1745, '欣': 1746, '欧': 1747, '欲': 1748, '欺': 1749, '款': 1750, '歇': 1751, '歉': 1752, '歌': 1753, '止': 1754, '正': 1755, '此': 1756, '步': 1757, '武': 1758, '歧': 1759, '歪': 1760, '歹': 1761, '死': 1762, '歼': 1763, '殃': 1764, '殆': 1765, '殉': 1766, '殊': 1767, '残': 1768, '殖': 1769, '殴': 1770, '段': 1771, '殷': 1772, '殿': 1773, '毁': 1774, '毅': 1775, '毋': 1776, '母': 1777, '每': 1778, '毒': 1779, '比': 1780, '毕': 1781, '毖': 1782, '毗': 1783, '毙': 1784, '毛': 1785, '毡': 1786, '毫': 1787, '毯': 1788, '氏': 1789, '民': 1790, '氓': 1791, '气': 1792, '氖': 1793, '氛': 1794, '氟': 1795, '氢': 1796, '氦': 1797, '氧': 1798, '氨': 1799, '氮': 1800, '氯': 1801, '氰': 1802, '水': 1803, '永': 1804, '汀': 1805, '汁': 1806, '求': 1807, '汇': 1808, '汉': 1809, '汐': 1810, '汕': 1811, '汗': 1812, '汛': 1813, '汝': 1814, '汞': 1815, '江': 1816, '池': 1817, '污': 1818, '汤': 1819, '汪': 1820, '汰': 1821, '汲': 1822, '汹': 1823, '汽': 1824, '汾': 1825, '沁': 1826, '沂': 1827, '沃': 1828, '沈': 1829, '沉': 1830, '沏': 1831, '沙': 1832, '沛': 1833, '沟': 1834, '没': 1835, '沤': 1836, '沥': 1837, '沦': 1838, '沧': 1839, '沪': 1840, '沫': 1841, '沮': 1842, '河': 1843, '沸': 1844, '油': 1845, '治': 1846, '沼': 1847, '沽': 1848, '沾': 1849, '沿': 1850, '泄': 1851, '泅': 1852, '泉': 1853, '泊': 1854, '泌': 1855, '法': 1856, '泛': 1857, '泞': 1858, '泡': 1859, '波': 1860, '泣': 1861, '泥': 1862, '注': 1863, '泪': 1864, '泰': 1865, '泳': 1866, '泵': 1867, '泻': 1868, '泼': 1869, '泽': 1870, '洁': 1871, '洋': 1872, '洒': 1873, '洗': 1874, '洛': 1875, '洞': 1876, '津': 1877, '洪': 1878, '洱': 1879, '洲': 1880, '活': 1881, '洼': 1882, '洽': 1883, '派': 1884, '流': 1885, '浅': 1886, '浆': 1887, '浇': 1888, '浊': 1889, '测': 1890, '济': 1891, '浑': 1892, '浓': 1893, '浙': 1894, '浚': 1895, '浦': 1896, '浩': 1897, '浪': 1898, '浮': 1899, '浴': 1900, '海': 1901, '浸': 1902, '涂': 1903, '涅': 1904, '消': 1905, '涉': 1906, '涌': 1907, '涎': 1908, '涕': 1909, '涛': 1910, '涝': 1911, '涟': 1912, '涡': 1913, '涣': 1914, '涤': 1915, '润': 1916, '涧': 1917, '涨': 1918, '涩': 1919, '涪': 1920, '涯': 1921, '液': 1922, '涵': 1923, '涸': 1924, '淀': 1925, '淄': 1926, '淆': 1927, '淋': 1928, '淌': 1929, '淑': 1930, '淖': 1931, '淘': 1932, '淡': 1933, '淤': 1934, '淫': 1935, '淬': 1936, '淮': 1937, '深': 1938, '淳': 1939, '混': 1940, '淹': 1941, '添': 1942, '清': 1943, '渊': 1944, '渍': 1945, '渐': 1946, '渔': 1947, '渗': 1948, '渝': 1949, '渠': 1950, '渡': 1951, '渣': 1952, '渤': 1953, '温': 1954, '渭': 1955, '港': 1956, '渴': 1957, '游': 1958, '渺': 1959, '湃': 1960, '湍': 1961, '湖': 1962, '湘': 1963, '湛': 1964, '湾': 1965, '湿': 1966, '溃': 1967, '溅': 1968, '溉': 1969, '源': 1970, '溜': 1971, '溢': 1972, '溪': 1973, '溯': 1974, '溶': 1975, '溺': 1976, '滁': 1977, '滇': 1978, '滋': 1979, '滑': 1980, '滓': 1981, '滔': 1982, '滚': 1983, '滞': 1984, '满': 1985, '滤': 1986, '滥': 1987, '滦': 1988, '滨': 1989, '滩': 1990, '滴': 1991, '漂': 1992, '漆': 1993, '漏': 1994, '漓': 1995, '演': 1996, '漠': 1997, '漫': 1998, '漱': 1999, '漳': 2000, '漾': 2001, '潍': 2002, '潘': 2003, '潜': 2004, '潞': 2005, '潦': 2006, '潭': 2007, '潮': 2008, '澄': 2009, '澈': 2010, '澎': 2011, '澜': 2012, '澡': 2013, '澳': 2014, '激': 2015, '濒': 2016, '瀑': 2017, '灌': 2018, '火': 2019, '灭': 2020, '灯': 2021, '灰': 2022, '灵': 2023, '灶': 2024, '灸': 2025, '灼': 2026, '灾': 2027, '灿': 2028, '炉': 2029, '炊': 2030, '炎': 2031, '炒': 2032, '炔': 2033, '炕': 2034, '炙': 2035, '炬': 2036, '炭': 2037, '炮': 2038, '炯': 2039, '炳': 2040, '炸': 2041, '点': 2042, '炼': 2043, '炽': 2044, '烁': 2045, '烂': 2046, '烃': 2047, '烈': 2048, '烘': 2049, '烙': 2050, '烛': 2051, '烟': 2052, '烤': 2053, '烦': 2054, '烧': 2055, '烩': 2056, '烫': 2057, '烬': 2058, '热': 2059, '烯': 2060, '烷': 2061, '烹': 2062, '烽': 2063, '焉': 2064, '焊': 2065, '焕': 2066, '焙': 2067, '焚': 2068, '焦': 2069, '焰': 2070, '然': 2071, '煌': 2072, '煎': 2073, '煞': 2074, '煤': 2075, '照': 2076, '煮': 2077, '煽': 2078, '熄': 2079, '熊': 2080, '熏': 2081, '熔': 2082, '熙': 2083, '熟': 2084, '熬': 2085, '燃': 2086, '燎': 2087, '燕': 2088, '燥': 2089, '爆': 2090, '爪': 2091, '爬': 2092, '爱': 2093, '爵': 2094, '父': 2095, '爷': 2096, '爸': 2097, '爹': 2098, '爽': 2099, '片': 2100, '版': 2101, '牌': 2102, '牙': 2103, '牛': 2104, '牟': 2105, '牡': 2106, '牢': 2107, '牧': 2108, '物': 2109, '牲': 2110, '牵': 2111, '特': 2112, '牺': 2113, '犀': 2114, '犁': 2115, '犊': 2116, '犬': 2117, '犯': 2118, '状': 2119, '犹': 2120, '狂': 2121, '狄': 2122, '狈': 2123, '狐': 2124, '狗': 2125, '狙': 2126, '狞': 2127, '狠': 2128, '狡': 2129, '独': 2130, '狭': 2131, '狮': 2132, '狰': 2133, '狱': 2134, '狸': 2135, '狼': 2136, '猎': 2137, '猖': 2138, '猛': 2139, '猜': 2140, '猩': 2141, '猪': 2142, '猫': 2143, '献': 2144, '猴': 2145, '猾': 2146, '猿': 2147, '獭': 2148, '玄': 2149, '率': 2150, '玉': 2151, '王': 2152, '玖': 2153, '玛': 2154, '玩': 2155, '玫': 2156, '环': 2157, '现': 2158, '玲': 2159, '玻': 2160, '珊': 2161, '珍': 2162, '珐': 2163, '珠': 2164, '班': 2165, '球': 2166, '琅': 2167, '理': 2168, '琉': 2169, '琐': 2170, '琢': 2171, '琳': 2172, '琴': 2173, '琵': 2174, '琶': 2175, '琼': 2176, '瑚': 2177, '瑞': 2178, '瑟': 2179, '瑰': 2180, '瑶': 2181, '璃': 2182, '瓜': 2183, '瓢': 2184, '瓣': 2185, '瓤': 2186, '瓦': 2187, '瓮': 2188, '瓶': 2189, '瓷': 2190, '甄': 2191, '甘': 2192, '甚': 2193, '甜': 2194, '生': 2195, '甥': 2196, '用': 2197, '甩': 2198, '甫': 2199, '甭': 2200, '田': 2201, '由': 2202, '甲': 2203, '申': 2204, '电': 2205, '男': 2206, '甸': 2207, '画': 2208, '畅': 2209, '界': 2210, '畏': 2211, '畔': 2212, '留': 2213, '畜': 2214, '略': 2215, '畦': 2216, '番': 2217, '畴': 2218, '畸': 2219, '疆': 2220, '疏': 2221, '疑': 2222, '疗': 2223, '疙': 2224, '疚': 2225, '疟': 2226, '疡': 2227, '疤': 2228, '疥': 2229, '疫': 2230, '疮': 2231, '疯': 2232, '疲': 2233, '疵': 2234, '疹': 2235, '疼': 2236, '疽': 2237, '疾': 2238, '病': 2239, '症': 2240, '痈': 2241, '痉': 2242, '痊': 2243, '痒': 2244, '痔': 2245, '痕': 2246, '痘': 2247, '痛': 2248, '痞': 2249, '痢': 2250, '痪': 2251, '痰': 2252, '痴': 2253, '痹': 2254, '瘁': 2255, '瘟': 2256, '瘤': 2257, '瘦': 2258, '瘩': 2259, '瘪': 2260, '瘫': 2261, '瘴': 2262, '瘸': 2263, '癌': 2264, '癣': 2265, '癸': 2266, '登': 2267, '白': 2268, '百': 2269, '皂': 2270, '的': 2271, '皆': 2272, '皇': 2273, '皋': 2274, '皑': 2275, '皖': 2276, '皮': 2277, '皱': 2278, '皿': 2279, '盂': 2280, '盅': 2281, '盆': 2282, '盈': 2283, '益': 2284, '盎': 2285, '盏': 2286, '盐': 2287, '监': 2288, '盒': 2289, '盔': 2290, '盖': 2291, '盗': 2292, '盘': 2293, '盛': 2294, '盟': 2295, '目': 2296, '盯': 2297, '盲': 2298, '直': 2299, '相': 2300, '盼': 2301, '盾': 2302, '省': 2303, '眉': 2304, '看': 2305, '真': 2306, '眠': 2307, '眨': 2308, '眩': 2309, '眯': 2310, '眶': 2311, '眷': 2312, '眺': 2313, '眼': 2314, '着': 2315, '睁': 2316, '睛': 2317, '睡': 2318, '督': 2319, '睦': 2320, '睫': 2321, '睬': 2322, '睹': 2323, '瞄': 2324, '瞅': 2325, '瞎': 2326, '瞒': 2327, '瞥': 2328, '瞧': 2329, '瞩': 2330, '瞪': 2331, '瞬': 2332, '瞳': 2333, '瞻': 2334, '矗': 2335, '矛': 2336, '矢': 2337, '矣': 2338, '知': 2339, '矩': 2340, '矫': 2341, '短': 2342, '矮': 2343, '石': 2344, '矽': 2345, '矾': 2346, '矿': 2347, '码': 2348, '砂': 2349, '砌': 2350, '砍': 2351, '砒': 2352, '研': 2353, '砖': 2354, '砚': 2355, '砧': 2356, '砰': 2357, '破': 2358, '砷': 2359, '砸': 2360, '砾': 2361, '础': 2362, '硅': 2363, '硒': 2364, '硕': 2365, '硝': 2366, '硫': 2367, '硬': 2368, '确': 2369, '硷': 2370, '硼': 2371, '碉': 2372, '碌': 2373, '碍': 2374, '碎': 2375, '碑': 2376, '碗': 2377, '碘': 2378, '碟': 2379, '碧': 2380, '碰': 2381, '碱': 2382, '碳': 2383, '碴': 2384, '碾': 2385, '磁': 2386, '磅': 2387, '磊': 2388, '磋': 2389, '磐': 2390, '磕': 2391, '磨': 2392, '磷': 2393, '磺': 2394, '礁': 2395, '示': 2396, '礼': 2397, '社': 2398, '祁': 2399, '祈': 2400, '祖': 2401, '祝': 2402, '神': 2403, '祟': 2404, '祥': 2405, '票': 2406, '祭': 2407, '祷': 2408, '祸': 2409, '禁': 2410, '禄': 2411, '福': 2412, '禹': 2413, '离': 2414, '禽': 2415, '禾': 2416, '秀': 2417, '私': 2418, '秃': 2419, '秆': 2420, '秉': 2421, '秋': 2422, '种': 2423, '科': 2424, '秒': 2425, '秘': 2426, '租': 2427, '秤': 2428, '秦': 2429, '秧': 2430, '秩': 2431, '积': 2432, '称': 2433, '秸': 2434, '移': 2435, '秽': 2436, '稀': 2437, '程': 2438, '稍': 2439, '税': 2440, '稗': 2441, '稚': 2442, '稠': 2443, '稳': 2444, '稻': 2445, '稼': 2446, '稽': 2447, '稿': 2448, '穆': 2449, '穗': 2450, '穴': 2451, '究': 2452, '穷': 2453, '空': 2454, '穿': 2455, '突': 2456, '窃': 2457, '窄': 2458, '窍': 2459, '窑': 2460, '窒': 2461, '窖': 2462, '窗': 2463, '窘': 2464, '窜': 2465, '窝': 2466, '窟': 2467, '窥': 2468, '窿': 2469, '立': 2470, '竖': 2471, '站': 2472, '竞': 2473, '竟': 2474, '章': 2475, '竣': 2476, '童': 2477, '竭': 2478, '端': 2479, '竹': 2480, '竿': 2481, '笆': 2482, '笋': 2483, '笑': 2484, '笔': 2485, '笛': 2486, '符': 2487, '笨': 2488, '第': 2489, '笺': 2490, '笼': 2491, '等': 2492, '筋': 2493, '筏': 2494, '筐': 2495, '筑': 2496, '筒': 2497, '答': 2498, '策': 2499, '筛': 2500, '筷': 2501, '筹': 2502, '签': 2503, '简': 2504, '箍': 2505, '箔': 2506, '箕': 2507, '算': 2508, '管': 2509, '箩': 2510, '箭': 2511, '箱': 2512, '篆': 2513, '篇': 2514, '篓': 2515, '篙': 2516, '篡': 2517, '篮': 2518, '篱': 2519, '篷': 2520, '簇': 2521, '簧': 2522, '簿': 2523, '籍': 2524, '米': 2525, '类': 2526, '籽': 2527, '粉': 2528, '粒': 2529, '粕': 2530, '粗': 2531, '粘': 2532, '粟': 2533, '粤': 2534, '粥': 2535, '粪': 2536, '粮': 2537, '粱': 2538, '粳': 2539, '粹': 2540, '精': 2541, '糊': 2542, '糕': 2543, '糖': 2544, '糙': 2545, '糜': 2546, '糟': 2547, '糠': 2548, '糯': 2549, '系': 2550, '紊': 2551, '素': 2552, '索': 2553, '紧': 2554, '紫': 2555, '累': 2556, '絮': 2557, '繁': 2558, '纂': 2559, '纠': 2560, '红': 2561, '纤': 2562, '约': 2563, '级': 2564, '纪': 2565, '纫': 2566, '纬': 2567, '纯': 2568, '纱': 2569, '纲': 2570, '纳': 2571, '纵': 2572, '纶': 2573, '纷': 2574, '纸': 2575, '纹': 2576, '纺': 2577, '纽': 2578, '线': 2579, '练': 2580, '组': 2581, '绅': 2582, '细': 2583, '织': 2584, '终': 2585, '绊': 2586, '绍': 2587, '绎': 2588, '经': 2589, '绑': 2590, '绒': 2591, '结': 2592, '绕': 2593, '绘': 2594, '给': 2595, '绚': 2596, '络': 2597, '绝': 2598, '绞': 2599, '统': 2600, '绢': 2601, '绣': 2602, '绥': 2603, '绦': 2604, '继': 2605, '绩': 2606, '绪': 2607, '续': 2608, '绰': 2609, '绳': 2610, '维': 2611, '绵': 2612, '绷': 2613, '绸': 2614, '综': 2615, '绽': 2616, '绿': 2617, '缀': 2618, '缄': 2619, '缅': 2620, '缆': 2621, '缉': 2622, '缎': 2623, '缓': 2624, '缔': 2625, '缕': 2626, '编': 2627, '缘': 2628, '缚': 2629, '缝': 2630, '缠': 2631, '缨': 2632, '缩': 2633, '缮': 2634, '缴': 2635, '缸': 2636, '缺': 2637, '罐': 2638, '网': 2639, '罕': 2640, '罗': 2641, '罚': 2642, '罢': 2643, '罩': 2644, '罪': 2645, '置': 2646, '署': 2647, '羊': 2648, '羌': 2649, '美': 2650, '羔': 2651, '羚': 2652, '羞': 2653, '羡': 2654, '群': 2655, '羹': 2656, '羽': 2657, '翁': 2658, '翅': 2659, '翌': 2660, '翔': 2661, '翘': 2662, '翟': 2663, '翠': 2664, '翰': 2665, '翱': 2666, '翻': 2667, '翼': 2668, '耀': 2669, '老': 2670, '考': 2671, '者': 2672, '而': 2673, '耍': 2674, '耐': 2675, '耕': 2676, '耗': 2677, '耘': 2678, '耙': 2679, '耪': 2680, '耳': 2681, '耶': 2682, '耸': 2683, '耻': 2684, '耽': 2685, '耿': 2686, '聂': 2687, '聊': 2688, '聋': 2689, '职': 2690, '联': 2691, '聘': 2692, '聚': 2693, '聪': 2694, '肃': 2695, '肄': 2696, '肆': 2697, '肇': 2698, '肉': 2699, '肋': 2700, '肌': 2701, '肖': 2702, '肘': 2703, '肚': 2704, '肛': 2705, '肝': 2706, '肠': 2707, '股': 2708, '肢': 2709, '肤': 2710, '肥': 2711, '肩': 2712, '肪': 2713, '肮': 2714, '肯': 2715, '育': 2716, '肺': 2717, '肾': 2718, '肿': 2719, '胀': 2720, '胁': 2721, '胃': 2722, '胆': 2723, '背': 2724, '胎': 2725, '胖': 2726, '胚': 2727, '胜': 2728, '胞': 2729, '胡': 2730, '胯': 2731, '胰': 2732, '胳': 2733, '胶': 2734, '胸': 2735, '胺': 2736, '能': 2737, '脂': 2738, '脆': 2739, '脉': 2740, '脊': 2741, '脏': 2742, '脐': 2743, '脑': 2744, '脓': 2745, '脖': 2746, '脚': 2747, '脯': 2748, '脱': 2749, '脸': 2750, '脾': 2751, '腆': 2752, '腊': 2753, '腋': 2754, '腐': 2755, '腑': 2756, '腔': 2757, '腕': 2758, '腥': 2759, '腮': 2760, '腰': 2761, '腹': 2762, '腺': 2763, '腻': 2764, '腾': 2765, '腿': 2766, '膀': 2767, '膊': 2768, '膏': 2769, '膘': 2770, '膛': 2771, '膜': 2772, '膝': 2773, '膨': 2774, '膳': 2775, '臀': 2776, '臂': 2777, '臃': 2778, '臆': 2779, '臣': 2780, '自': 2781, '臭': 2782, '至': 2783, '致': 2784, '臻': 2785, '臼': 2786, '舀': 2787, '舅': 2788, '舆': 2789, '舌': 2790, '舍': 2791, '舒': 2792, '舔': 2793, '舜': 2794, '舞': 2795, '舟': 2796, '航': 2797, '般': 2798, '舰': 2799, '舱': 2800, '舵': 2801, '舶': 2802, '舷': 2803, '船': 2804, '艇': 2805, '艘': 2806, '良': 2807, '艰': 2808, '色': 2809, '艳': 2810, '艺': 2811, '艾': 2812, '节': 2813, '芋': 2814, '芍': 2815, '芒': 2816, '芜': 2817, '芝': 2818, '芥': 2819, '芦': 2820, '芬': 2821, '芭': 2822, '芯': 2823, '花': 2824, '芳': 2825, '芹': 2826, '芽': 2827, '苇': 2828, '苍': 2829, '苏': 2830, '苑': 2831, '苔': 2832, '苗': 2833, '苛': 2834, '苞': 2835, '苟': 2836, '若': 2837, '苦': 2838, '苫': 2839, '苯': 2840, '英': 2841, '苹': 2842, '茁': 2843, '茂': 2844, '范': 2845, '茄': 2846, '茅': 2847, '茎': 2848, '茧': 2849, '茨': 2850, '茫': 2851, '茬': 2852, '茵': 2853, '茶': 2854, '茸': 2855, '茹': 2856, '荆': 2857, '草': 2858, '荐': 2859, '荒': 2860, '荔': 2861, '荚': 2862, '荡': 2863, '荣': 2864, '荤': 2865, '荧': 2866, '荫': 2867, '药': 2868, '荷': 2869, '莆': 2870, '莉': 2871, '莎': 2872, '莫': 2873, '莱': 2874, '莲': 2875, '获': 2876, '莹': 2877, '莽': 2878, '菇': 2879, '菊': 2880, '菌': 2881, '菏': 2882, '菜': 2883, '菠': 2884, '菩': 2885, '菱': 2886, '菲': 2887, '萄': 2888, '萌': 2889, '萍': 2890, '萎': 2891, '萝': 2892, '萤': 2893, '营': 2894, '萧': 2895, '萨': 2896, '落': 2897, '著': 2898, '葛': 2899, '葡': 2900, '董': 2901, '葫': 2902, '葬': 2903, '葱': 2904, '葵': 2905, '蒂': 2906, '蒋': 2907, '蒙': 2908, '蒜': 2909, '蒲': 2910, '蒸': 2911, '蓄': 2912, '蓉': 2913, '蓑': 2914, '蓖': 2915, '蓝': 2916, '蓟': 2917, '蓬': 2918, '蔑': 2919, '蔓': 2920, '蔗': 2921, '蔚': 2922, '蔡': 2923, '蔫': 2924, '蔬': 2925, '蔷': 2926, '蔼': 2927, '蔽': 2928, '蕉': 2929, '蕊': 2930, '蕴': 2931, '蕾': 2932, '薄': 2933, '薛': 2934, '薪': 2935, '薯': 2936, '藉': 2937, '藏': 2938, '藐': 2939, '藕': 2940, '藤': 2941, '藩': 2942, '藻': 2943, '蘑': 2944, '蘸': 2945, '虎': 2946, '虏': 2947, '虐': 2948, '虑': 2949, '虚': 2950, '虞': 2951, '虫': 2952, '虱': 2953, '虹': 2954, '虽': 2955, '虾': 2956, '蚀': 2957, '蚁': 2958, '蚂': 2959, '蚊': 2960, '蚌': 2961, '蚕': 2962, '蚜': 2963, '蚤': 2964, '蛀': 2965, '蛆': 2966, '蛇': 2967, '蛊': 2968, '蛋': 2969, '蛔': 2970, '蛙': 2971, '蛛': 2972, '蛤': 2973, '蛮': 2974, '蛰': 2975, '蛹': 2976, '蛾': 2977, '蜀': 2978, '蜂': 2979, '蜒': 2980, '蜕': 2981, '蜗': 2982, '蜘': 2983, '蜜': 2984, '蜡': 2985, '蝇': 2986, '蝉': 2987, '蝎': 2988, '蝗': 2989, '蝴': 2990, '蝶': 2991, '融': 2992, '螟': 2993, '螺': 2994, '蟹': 2995, '蠕': 2996, '蠢': 2997, '血': 2998, '衅': 2999, '行': 3000, '衍': 3001, '衔': 3002, '街': 3003, '衙': 3004, '衡': 3005, '衣': 3006, '补': 3007, '表': 3008, '衫': 3009, '衬': 3010, '衰': 3011, '衷': 3012, '袁': 3013, '袄': 3014, '袋': 3015, '袍': 3016, '袒': 3017, '袖': 3018, '袜': 3019, '被': 3020, '袭': 3021, '袱': 3022, '裁': 3023, '裂': 3024, '装': 3025, '裔': 3026, '裕': 3027, '裙': 3028, '裤': 3029, '裳': 3030, '裴': 3031, '裸': 3032, '裹': 3033, '褂': 3034, '褐': 3035, '褒': 3036, '褥': 3037, '褪': 3038, '襄': 3039, '襟': 3040, '西': 3041, '要': 3042, '覆': 3043, '见': 3044, '观': 3045, '规': 3046, '觅': 3047, '视': 3048, '览': 3049, '觉': 3050, '角': 3051, '解': 3052, '触': 3053, '言': 3054, '詹': 3055, '誉': 3056, '誊': 3057, '誓': 3058, '警': 3059, '譬': 3060, '计': 3061, '订': 3062, '讣': 3063, '认': 3064, '讥': 3065, '讨': 3066, '让': 3067, '讫': 3068, '训': 3069, '议': 3070, '讯': 3071, '记': 3072, '讲': 3073, '讳': 3074, '讶': 3075, '许': 3076, '讹': 3077, '论': 3078, '讼': 3079, '讽': 3080, '设': 3081, '访': 3082, '诀': 3083, '证': 3084, '评': 3085, '诅': 3086, '识': 3087, '诈': 3088, '诉': 3089, '诊': 3090, '诌': 3091, '词': 3092, '译': 3093, '试': 3094, '诗': 3095, '诚': 3096, '诛': 3097, '话': 3098, '诞': 3099, '诡': 3100, '询': 3101, '诣': 3102, '该': 3103, '详': 3104, '诧': 3105, '诫': 3106, '诬': 3107, '语': 3108, '误': 3109, '诱': 3110, '诲': 3111, '说': 3112, '诵': 3113, '请': 3114, '诸': 3115, '诺': 3116, '读': 3117, '诽': 3118, '课': 3119, '谁': 3120, '调': 3121, '谅': 3122, '谆': 3123, '谈': 3124, '谊': 3125, '谋': 3126, '谍': 3127, '谎': 3128, '谐': 3129, '谓': 3130, '谗': 3131, '谚': 3132, '谜': 3133, '谢': 3134, '谣': 3135, '谤': 3136, '谦': 3137, '谨': 3138, '谩': 3139, '谬': 3140, '谭': 3141, '谰': 3142, '谱': 3143, '谴': 3144, '谷': 3145, '豁': 3146, '豆': 3147, '豌': 3148, '象': 3149, '豢': 3150, '豪': 3151, '豫': 3152, '豹': 3153, '豺': 3154, '貉': 3155, '貌': 3156, '贝': 3157, '贞': 3158, '负': 3159, '贡': 3160, '财': 3161, '责': 3162, '贤': 3163, '败': 3164, '账': 3165, '货': 3166, '质': 3167, '贩': 3168, '贪': 3169, '贫': 3170, '贬': 3171, '购': 3172, '贮': 3173, '贯': 3174, '贰': 3175, '贱': 3176, '贴': 3177, '贵': 3178, '贷': 3179, '贸': 3180, '费': 3181, '贺': 3182, '贼': 3183, '贾': 3184, '贿': 3185, '赁': 3186, '赂': 3187, '赃': 3188, '资': 3189, '赊': 3190, '赋': 3191, '赌': 3192, '赎': 3193, '赏': 3194, '赐': 3195, '赔': 3196, '赖': 3197, '赘': 3198, '赚': 3199, '赛': 3200, '赞': 3201, '赠': 3202, '赡': 3203, '赢': 3204, '赣': 3205, '赤': 3206, '赦': 3207, '赫': 3208, '走': 3209, '赴': 3210, '赵': 3211, '赶': 3212, '起': 3213, '趁': 3214, '超': 3215, '越': 3216, '趋': 3217, '趟': 3218, '趣': 3219, '足': 3220, '趴': 3221, '趾': 3222, '跃': 3223, '跋': 3224, '跌': 3225, '跑': 3226, '距': 3227, '跟': 3228, '跨': 3229, '跪': 3230, '路': 3231, '跳': 3232, '践': 3233, '跺': 3234, '踊': 3235, '踌': 3236, '踏': 3237, '踞': 3238, '踢': 3239, '踩': 3240, '踪': 3241, '蹄': 3242, '蹈': 3243, '蹋': 3244, '蹦': 3245, '蹬': 3246, '蹭': 3247, '蹲': 3248, '蹿': 3249, '躁': 3250, '躇': 3251, '身': 3252, '躬': 3253, '躯': 3254, '躲': 3255, '躺': 3256, '车': 3257, '轧': 3258, '轨': 3259, '轩': 3260, '转': 3261, '轮': 3262, '软': 3263, '轰': 3264, '轴': 3265, '轻': 3266, '载': 3267, '轿': 3268, '较': 3269, '辅': 3270, '辆': 3271, '辈': 3272, '辉': 3273, '辊': 3274, '辐': 3275, '辑': 3276, '输': 3277, '辕': 3278, '辖': 3279, '辗': 3280, '辙': 3281, '辛': 3282, '辜': 3283, '辞': 3284, '辟': 3285, '辣': 3286, '辨': 3287, '辩': 3288, '辫': 3289, '辰': 3290, '辱': 3291, '边': 3292, '辽': 3293, '达': 3294, '迁': 3295, '迂': 3296, '迄': 3297, '迅': 3298, '过': 3299, '迈': 3300, '迎': 3301, '运': 3302, '近': 3303, '返': 3304, '还': 3305, '这': 3306, '进': 3307, '远': 3308, '违': 3309, '连': 3310, '迟': 3311, '迢': 3312, '迪': 3313, '迫': 3314, '迭': 3315, '述': 3316, '迷': 3317, '迸': 3318, '迹': 3319, '追': 3320, '退': 3321, '送': 3322, '适': 3323, '逃': 3324, '逆': 3325, '选': 3326, '逊': 3327, '透': 3328, '逐': 3329, '递': 3330, '途': 3331, '逗': 3332, '通': 3333, '逛': 3334, '逝': 3335, '逞': 3336, '速': 3337, '造': 3338, '逢': 3339, '逮': 3340, '逸': 3341, '逻': 3342, '逼': 3343, '逾': 3344, '遁': 3345, '遂': 3346, '遇': 3347, '遍': 3348, '遏': 3349, '道': 3350, '遗': 3351, '遣': 3352, '遥': 3353, '遭': 3354, '遮': 3355, '遵': 3356, '避': 3357, '邀': 3358, '邑': 3359, '邓': 3360, '邢': 3361, '那': 3362, '邦': 3363, '邪': 3364, '邮': 3365, '邯': 3366, '邱': 3367, '邵': 3368, '邹': 3369, '邻': 3370, '郁': 3371, '郊': 3372, '郎': 3373, '郑': 3374, '郝': 3375, '郡': 3376, '郧': 3377, '部': 3378, '郭': 3379, '郴': 3380, '郸': 3381, '都': 3382, '鄂': 3383, '鄙': 3384, '酉': 3385, '酋': 3386, '酌': 3387, '配': 3388, '酒': 3389, '酗': 3390, '酚': 3391, '酝': 3392, '酞': 3393, '酣': 3394, '酥': 3395, '酪': 3396, '酬': 3397, '酮': 3398, '酱': 3399, '酵': 3400, '酶': 3401, '酷': 3402, '酸': 3403, '酿': 3404, '醇': 3405, '醉': 3406, '醋': 3407, '醒': 3408, '醚': 3409, '醛': 3410, '采': 3411, '釉': 3412, '释': 3413, '里': 3414, '重': 3415, '野': 3416, '量': 3417, '金': 3418, '釜': 3419, '鉴': 3420, '针': 3421, '钉': 3422, '钎': 3423, '钒': 3424, '钓': 3425, '钙': 3426, '钝': 3427, '钞': 3428, '钟': 3429, '钠': 3430, '钡': 3431, '钢': 3432, '钥': 3433, '钦': 3434, '钧': 3435, '钨': 3436, '钩': 3437, '钮': 3438, '钱': 3439, '钳': 3440, '钵': 3441, '钻': 3442, '钾': 3443, '铀': 3444, '铁': 3445, '铂': 3446, '铃': 3447, '铅': 3448, '铆': 3449, '铜': 3450, '铝': 3451, '铡': 3452, '铣': 3453, '铬': 3454, '铭': 3455, '铰': 3456, '铱': 3457, '铲': 3458, '银': 3459, '铸': 3460, '铺': 3461, '链': 3462, '销': 3463, '锁': 3464, '锄': 3465, '锅': 3466, '锈': 3467, '锋': 3468, '锌': 3469, '锐': 3470, '锑': 3471, '锗': 3472, '错': 3473, '锚': 3474, '锡': 3475, '锣': 3476, '锤': 3477, '锥': 3478, '锦': 3479, '锨': 3480, '锭': 3481, '键': 3482, '锯': 3483, '锰': 3484, '锹': 3485, '锻': 3486, '镀': 3487, '镁': 3488, '镇': 3489, '镊': 3490, '镍': 3491, '镐': 3492, '镑': 3493, '镜': 3494, '镣': 3495, '镭': 3496, '镰': 3497, '镶': 3498, '长': 3499, '门': 3500, '闪': 3501, '闭': 3502, '问': 3503, '闯': 3504, '闰': 3505, '闲': 3506, '间': 3507, '闷': 3508, '闸': 3509, '闹': 3510, '闺': 3511, '闻': 3512, '闽': 3513, '阀': 3514, '阁': 3515, '阂': 3516, '阅': 3517, '阉': 3518, '阎': 3519, '阐': 3520, '阑': 3521, '阔': 3522, '阜': 3523, '队': 3524, '阮': 3525, '防': 3526, '阳': 3527, '阴': 3528, '阵': 3529, '阶': 3530, '阻': 3531, '阿': 3532, '陀': 3533, '附': 3534, '际': 3535, '陆': 3536, '陇': 3537, '陈': 3538, '陋': 3539, '陌': 3540, '降': 3541, '限': 3542, '陕': 3543, '陛': 3544, '陡': 3545, '院': 3546, '除': 3547, '陨': 3548, '险': 3549, '陪': 3550, '陵': 3551, '陶': 3552, '陷': 3553, '隅': 3554, '隆': 3555, '隋': 3556, '随': 3557, '隐': 3558, '隔': 3559, '隘': 3560, '隙': 3561, '障': 3562, '隧': 3563, '隶': 3564, '难': 3565, '雀': 3566, '雁': 3567, '雄': 3568, '雅': 3569, '集': 3570, '雇': 3571, '雌': 3572, '雍': 3573, '雏': 3574, '雕': 3575, '雨': 3576, '雪': 3577, '零': 3578, '雷': 3579, '雹': 3580, '雾': 3581, '需': 3582, '霄': 3583, '震': 3584, '霉': 3585, '霍': 3586, '霓': 3587, '霖': 3588, '霜': 3589, '霞': 3590, '露': 3591, '霸': 3592, '霹': 3593, '青': 3594, '靖': 3595, '静': 3596, '靛': 3597, '非': 3598, '靠': 3599, '靡': 3600, '面': 3601, '革': 3602, '靳': 3603, '靴': 3604, '靶': 3605, '鞋': 3606, '鞍': 3607, '鞘': 3608, '鞠': 3609, '鞭': 3610, '韦': 3611, '韧': 3612, '韩': 3613, '韭': 3614, '音': 3615, '韵': 3616, '韶': 3617, '页': 3618, '顶': 3619, '顷': 3620, '项': 3621, '顺': 3622, '须': 3623, '顽': 3624, '顾': 3625, '顿': 3626, '颁': 3627, '颂': 3628, '预': 3629, '颅': 3630, '领': 3631, '颇': 3632, '颈': 3633, '颊': 3634, '颐': 3635, '频': 3636, '颓': 3637, '颖': 3638, '颗': 3639, '题': 3640, '颜': 3641, '额': 3642, '颠': 3643, '颤': 3644, '颧': 3645, '风': 3646, '飘': 3647, '飞': 3648, '食': 3649, '餐': 3650, '饥': 3651, '饭': 3652, '饮': 3653, '饯': 3654, '饰': 3655, '饱': 3656, '饲': 3657, '饵': 3658, '饶': 3659, '饺': 3660, '饼': 3661, '饿': 3662, '馁': 3663, '馅': 3664, '馆': 3665, '馈': 3666, '馋': 3667, '馏': 3668, '馒': 3669, '首': 3670, '香': 3671, '马': 3672, '驭': 3673, '驮': 3674, '驯': 3675, '驰': 3676, '驱': 3677, '驳': 3678, '驴': 3679, '驶': 3680, '驹': 3681, '驻': 3682, '驼': 3683, '驾': 3684, '骂': 3685, '骄': 3686, '骆': 3687, '骇': 3688, '骋': 3689, '验': 3690, '骏': 3691, '骑': 3692, '骗': 3693, '骚': 3694, '骡': 3695, '骤': 3696, '骨': 3697, '骸': 3698, '髓': 3699, '高': 3700, '鬃': 3701, '鬼': 3702, '魁': 3703, '魂': 3704, '魄': 3705, '魏': 3706, '魔': 3707, '鱼': 3708, '鲁': 3709, '鲍': 3710, '鲜': 3711, '鲤': 3712, '鲸': 3713, '鳃': 3714, '鳖': 3715, '鳞': 3716, '鸟': 3717, '鸡': 3718, '鸣': 3719, '鸥': 3720, '鸦': 3721, '鸭': 3722, '鸯': 3723, '鸳': 3724, '鸵': 3725, '鸽': 3726, '鸿': 3727, '鹃': 3728, '鹅': 3729, '鹊': 3730, '鹏': 3731, '鹤': 3732, '鹰': 3733, '鹿': 3734, '麓': 3735, '麦': 3736, '麻': 3737, '黄': 3738, '黍': 3739, '黎': 3740, '黑': 3741, '黔': 3742, '默': 3743, '鼎': 3744, '鼓': 3745, '鼠': 3746, '鼻': 3747, '齐': 3748, '齿': 3749, '龄': 3750, '龋': 3751, '龙': 3752, '龚': 3753, '龟': 3754}
char_dict.items()
zip(char_dict.values(), char_dict.keys())
New_char_dict = dict(zip(char_dict.values(), char_dict.keys()))

gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)
FLAGS = tf.app.flags.FLAGS


class DataIterator:
    def __init__(self, data_dir):
        # Set FLAGS.charset_size to a small value if available computation power is limited.
        truncate_path = data_dir + ('%05d' % FLAGS.charset_size)
        print(truncate_path)
        self.image_names = []
        for root, sub_folder, file_list in os.walk(data_dir):
            if root < truncate_path:
                self.image_names += [os.path.join(root, file_path) for file_path in file_list]
        random.shuffle(self.image_names)
        self.labels = [int(file_name[len(data_dir):].split(os.sep)[0]) for file_name in self.image_names]

    @property
    def size(self):
        return len(self.labels)

    @staticmethod
    def data_augmentation(images):
        if FLAGS.random_flip_up_down:
            images = tf.image.random_flip_up_down(images)
        if FLAGS.random_brightness:
            images = tf.image.random_brightness(images, max_delta=0.3)
        if FLAGS.random_contrast:
            images = tf.image.random_contrast(images, 0.8, 1.2)
        return images

    def input_pipeline(self, batch_size, num_epochs=None, aug=False):
        images_tensor = tf.convert_to_tensor(self.image_names, dtype=tf.string)
        labels_tensor = tf.convert_to_tensor(self.labels, dtype=tf.int64)
        input_queue = tf.train.slice_input_producer([images_tensor, labels_tensor], num_epochs=num_epochs)

        labels = input_queue[1]
        images_content = tf.read_file(input_queue[0])
        images = tf.image.convert_image_dtype(tf.image.decode_png(images_content, channels=1), tf.float32)
        if aug:
            images = self.data_augmentation(images)
        new_size = tf.constant([FLAGS.image_size, FLAGS.image_size], dtype=tf.int32)
        images = tf.image.resize_images(images, new_size)
        image_batch, label_batch = tf.train.shuffle_batch([images, labels], batch_size=batch_size, capacity=50000,
                                                          min_after_dequeue=10000)
        # print 'image_batch', image_batch.get_shape()
        return image_batch, label_batch


def build_graph(top_k):#手写汉字识别卷积神经网络结构
    keep_prob = tf.placeholder(dtype=tf.float32, shape=[], name='keep_prob')
    images = tf.placeholder(dtype=tf.float32, shape=[None, 64, 64, 1], name='image_batch')
    labels = tf.placeholder(dtype=tf.int64, shape=[None], name='label_batch')
    is_training = tf.placeholder(dtype=tf.bool, shape=[], name='train_flag')
    with tf.device('/gpu:0'):
        with slim.arg_scope([slim.conv2d, slim.fully_connected],
                            normalizer_fn=slim.batch_norm,
                            normalizer_params={'is_training': is_training}):
            conv3_1 = slim.conv2d(images, 64, [3, 3], 1, padding='SAME', scope='conv3_1')
            max_pool_1 = slim.max_pool2d(conv3_1, [2, 2], [2, 2], padding='SAME', scope='pool1')
            conv3_2 = slim.conv2d(max_pool_1, 128, [3, 3], padding='SAME', scope='conv3_2')
            max_pool_2 = slim.max_pool2d(conv3_2, [2, 2], [2, 2], padding='SAME', scope='pool2')
            conv3_3 = slim.conv2d(max_pool_2, 256, [3, 3], padding='SAME', scope='conv3_3')
            max_pool_3 = slim.max_pool2d(conv3_3, [2, 2], [2, 2], padding='SAME', scope='pool3')
            conv3_4 = slim.conv2d(max_pool_3, 512, [3, 3], padding='SAME', scope='conv3_4')
            conv3_5 = slim.conv2d(conv3_4, 512, [3, 3], padding='SAME', scope='conv3_5')
            max_pool_4 = slim.max_pool2d(conv3_5, [2, 2], [2, 2], padding='SAME', scope='pool4')

            flatten = slim.flatten(max_pool_4)
            fc1 = slim.fully_connected(slim.dropout(flatten, keep_prob), 1024,
                                       activation_fn=tf.nn.relu, scope='fc1')
            logits = slim.fully_connected(slim.dropout(fc1, keep_prob), FLAGS.charset_size, activation_fn=None,
                                          scope='fc2')
        loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=labels))
        accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(logits, 1), labels), tf.float32))

        update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
        if update_ops:
            updates = tf.group(*update_ops)
            loss = control_flow_ops.with_dependencies([updates], loss)

        global_step = tf.get_variable("step", [], initializer=tf.constant_initializer(0.0), trainable=False)
        optimizer = tf.train.AdamOptimizer(learning_rate=0.1)
        train_op = slim.learning.create_train_op(loss, optimizer, global_step=global_step)
        probabilities = tf.nn.softmax(logits)

        tf.summary.scalar('loss', loss)
        tf.summary.scalar('accuracy', accuracy)
        merged_summary_op = tf.summary.merge_all()
        predicted_val_top_k, predicted_index_top_k = tf.nn.top_k(probabilities, k=top_k)
        accuracy_in_top_k = tf.reduce_mean(tf.cast(tf.nn.in_top_k(probabilities, labels, top_k), tf.float32))

    return {'images': images,
            'labels': labels,
            'keep_prob': keep_prob,
            'top_k': top_k,
            'global_step': global_step,
            'train_op': train_op,
            'loss': loss,
            'is_training': is_training,
            'accuracy': accuracy,
            'accuracy_top_k': accuracy_in_top_k,
            'merged_summary_op': merged_summary_op,
            'predicted_distribution': probabilities,
            'predicted_index_top_k': predicted_index_top_k,
            'predicted_val_top_k': predicted_val_top_k}


def train():#手写汉字识别模型训练
    print('Begin training')
    train_feeder = DataIterator(data_dir='./train/')
    test_feeder = DataIterator(data_dir='./test/')
    model_name = 'chinese-rec-model'
    with tf.Session(config=tf.ConfigProto(gpu_options=gpu_options, allow_soft_placement=True)) as sess:
        train_images, train_labels = train_feeder.input_pipeline(batch_size=FLAGS.batch_size, aug=True)
        test_images, test_labels = test_feeder.input_pipeline(batch_size=FLAGS.batch_size)
        graph = build_graph(top_k=1)
        saver = tf.train.Saver()
        sess.run(tf.global_variables_initializer())
        coord = tf.train.Coordinator()
        threads = tf.train.start_queue_runners(sess=sess, coord=coord)

        train_writer = tf.summary.FileWriter(FLAGS.log_dir + '/train', sess.graph)
        test_writer = tf.summary.FileWriter(FLAGS.log_dir + '/val')
        start_step = 0
        if FLAGS.restore:
            ckpt = tf.train.latest_checkpoint(FLAGS.checkpoint_dir)
            if ckpt:
                saver.restore(sess, ckpt)
                print("restore from the checkpoint {0}".format(ckpt))
                start_step += int(ckpt.split('-')[-1])

        logger.info(':::Training Start:::')
        try:
            i = 0
            while not coord.should_stop():
                i += 1
                start_time = time.time()
                train_images_batch, train_labels_batch = sess.run([train_images, train_labels])
                feed_dict = {graph['images']: train_images_batch,
                             graph['labels']: train_labels_batch,
                             graph['keep_prob']: 0.8,
                             graph['is_training']: True}
                _, loss_val, train_summary, step = sess.run(
                    [graph['train_op'], graph['loss'], graph['merged_summary_op'], graph['global_step']],
                    feed_dict=feed_dict)
                train_writer.add_summary(train_summary, step)
                end_time = time.time()
                logger.info("the step {0} takes {1} loss {2}".format(step, end_time - start_time, loss_val))
                if step > FLAGS.max_steps:
                    break
                if step % FLAGS.eval_steps == 1:
                    test_images_batch, test_labels_batch = sess.run([test_images, test_labels])
                    feed_dict = {graph['images']: test_images_batch,
                                 graph['labels']: test_labels_batch,
                                 graph['keep_prob']: 1.0,
                                 graph['is_training']: True}
                    accuracy_test, test_summary = sess.run([graph['accuracy'], graph['merged_summary_op']],
                                                           feed_dict=feed_dict)
                    if step > 300:
                        test_writer.add_summary(test_summary, step)
                    logger.info('===============Eval a batch=======================')
                    logger.info('the step {0} test accuracy: {1}'
                                .format(step, accuracy_test))
                    logger.info('===============Eval a batch=======================')
                if step % FLAGS.save_steps == 1:
                    logger.info('Save the ckpt of {0}'.format(step))
                    saver.save(sess, os.path.join(FLAGS.checkpoint_dir, model_name),
                               global_step=graph['global_step'])
        except tf.errors.OutOfRangeError:
            logger.info('==================Train Finished================')
            saver.save(sess, os.path.join(FLAGS.checkpoint_dir, model_name), global_step=graph['global_step'])
        finally:
            coord.request_stop()
        coord.join(threads)


def validation():
    print('Begin validation')
    test_feeder = DataIterator(data_dir='./test/')

    final_predict_val = []
    final_predict_index = []
    groundtruth = []
    config = tf.ConfigProto(allow_soft_placement=True)

    with tf.Session(config=config) as sess:
        test_images, test_labels = test_feeder.input_pipeline(batch_size=FLAGS.batch_size, num_epochs=1)
        graph = build_graph(top_k=3)
        saver = tf.train.Saver()

        sess.run(tf.global_variables_initializer())
        sess.run(tf.local_variables_initializer())  # initialize test_feeder's inside state

        coord = tf.train.Coordinator()
        threads = tf.train.start_queue_runners(sess=sess, coord=coord)

        ckpt = tf.train.latest_checkpoint(FLAGS.checkpoint_dir)
        if ckpt:
            saver.restore(sess, ckpt)
            print("restore from the checkpoint {0}".format(ckpt))

        logger.info(':::Start validation:::')
        try:
            i = 0
            acc_top_1, acc_top_k = 0.0, 0.0
            while not coord.should_stop():
                i += 1
                start_time = time.time()
                test_images_batch, test_labels_batch = sess.run([test_images, test_labels])
                feed_dict = {graph['images']: test_images_batch,
                             graph['labels']: test_labels_batch,
                             graph['keep_prob']: 1.0,
                             graph['is_training']: False}
                batch_labels, probs, indices, acc_1, acc_k = sess.run([graph['labels'],
                                                                       graph['predicted_val_top_k'],
                                                                       graph['predicted_index_top_k'],
                                                                       graph['accuracy'],
                                                                       graph['accuracy_top_k']], feed_dict=feed_dict)
                final_predict_val += probs.tolist()
                final_predict_index += indices.tolist()
                groundtruth += batch_labels.tolist()
                acc_top_1 += acc_1
                acc_top_k += acc_k
                end_time = time.time()
                logger.info("the batch {0} takes {1} seconds, accuracy = {2}(top_1) {3}(top_k)"
                            .format(i, end_time - start_time, acc_1, acc_k))

        except tf.errors.OutOfRangeError:
            logger.info('==================Validation Finished================')
            acc_top_1 = acc_top_1 * FLAGS.batch_size / test_feeder.size
            acc_top_k = acc_top_k * FLAGS.batch_size / test_feeder.size
            logger.info('top 1 accuracy {0} top k accuracy {1}'.format(acc_top_1, acc_top_k))
        finally:
            coord.request_stop()
        coord.join(threads)
    return {'prob': final_predict_val, 'indices': final_predict_index, 'groundtruth': groundtruth}


def inference(image, get_all):#手写汉字识别函数，对chinese_out.py与chinese_out_jiguan.py的接口
    print('inference')
    tf.reset_default_graph()
    
    #temp_image = Image.open(image).convert('L')
    temp_image = image
    #图像预处理
    temp_image = temp_image.resize((FLAGS.image_size, FLAGS.image_size), Image.ANTIALIAS)
    temp_image = np.asarray(temp_image) / 255.0
    temp_image = temp_image.reshape([-1, 64, 64, 1])

    config = tf.ConfigProto(allow_soft_placement=True)
    
    with tf.Session(config=config) as sess:
        logger.info('========start inference============')
        # images = tf.placeholder(dtype=tf.float32, shape=[None, 64, 64, 1])
        # Pass a shadow label 0. This label will not affect the computation graph.
        graph = build_graph(top_k=3)
        saver = tf.train.Saver()
        ckpt = tf.train.latest_checkpoint(FLAGS.checkpoint_dir)#先前训练好的模型保存在“./checkpoint/”中
        if ckpt:
            saver.restore(sess, ckpt)
        predict_val, predict_index = sess.run([graph['predicted_val_top_k'], graph['predicted_index_top_k']],
                                              feed_dict={graph['images']: temp_image,
                                                         graph['keep_prob']: 1.0,
                                                         graph['is_training']: False})#识别
    #return predict_val, predict_index
    
    #print "len(predict_index[0])",(len(predict_index[0]))
    print New_char_dict[predict_index[0][0]], New_char_dict[predict_index[0][1]], New_char_dict[predict_index[0][2]]
    if get_all == 1:
        return predict_index[0][0], predict_index[0][1], predict_index[0][2]#返回三个识别结果的汉字编号
    else:
        number = predict_index[0][0]
        #print(New_char_dict[number])
        return New_char_dict[number]#返回最佳识别结果对应的汉字字符


def main(_):
    print(FLAGS.mode)
    if FLAGS.mode == "train":
        train()
    elif FLAGS.mode == 'validation':
        dct = validation()
        result_file = 'result.dict'
        logger.info('Write result into {0}'.format(result_file))
        with open(result_file, 'wb') as f:
            pickle.dump(dct, f)
        logger.info('Write file ends')
    elif FLAGS.mode == 'inference':
        #image_path = './test/00190/13320.png'
        image_path = '30660.png'
        final_predict_val, final_predict_index = inference(image_path)
        print(final_predict_index[0][0])
        number = final_predict_index[0][0]
        print(New_char_dict[number])
        logger.info('the result info label {0} predict index {1} predict_val {2}'.format(190, final_predict_index,
                                                                                         final_predict_val))

if __name__ == "__main__":
    tf.app.run()
